﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using DevExpress.XtraEditors;
using System.Linq;
using DevExpress.XtraGrid.Views.Grid;
using DevExpress.XtraGrid.Views.Base;

namespace ThuPhiVeSinh
{
    public partial class frmCapPhatVe : DevExpress.XtraEditors.XtraForm
    {
        DataClasses_TPVSDataContext dc = new DataClasses_TPVSDataContext();
        Cap_Phat cp;
        VeCoTheCapResult ve;

        public frmCapPhatVe()
        {
            InitializeComponent();
        }

        //Điều hướng
        #region
        private void txtTuSo_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                txtDenSo.Focus();
            }
        }

        private void txtDenSo_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                btCapPhat.Focus();
            }
        }

        private void cbbNhanVien_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                txtTuSo.Focus();
            }
        }

        private void gvVeDaCap_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                btThuHoi.Focus();
            }
        }

        private void gvVeCoTheCap_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                cbbNhanVien.Focus();
            }
        }
        #endregion

        //Test
        #region
        private Boolean TestTuSo_DenSo()
        {
            Boolean rs1 = true;
            Boolean rs2 = true;

            if (txtTuSo.Text != "")
            {
                int ts = int.Parse(txtTuSo.Text);
                if (ts < ve.TuSo)
                {
                    rs1 = false;
                    dxTuSo.SetError(txtTuSo, "Số vé cấp phát phải lớn hơn hoặc bằng " + ve.TuSo);
                }
                else if (ts > ve.DenSo)
                {
                    rs1 = false;
                    dxTuSo.SetError(txtTuSo, "Số vé cấp phát phải nhỏ hơn hoặc bằng " + ve.DenSo);
                }
                else
                {
                    dxTuSo.ClearErrors();
                    rs1 = true;
                }
            }
            else
            {
                rs1 = false;
                dxTuSo.SetError(txtTuSo, "Vui lòng nhập số vé đầu tiên.");
            }

            if (txtDenSo.Text != "")
            {
                int ds = int.Parse(txtDenSo.Text);
                if (ds > ve.DenSo)
                {
                    rs2 = false;
                    dxDenSo.SetError(txtDenSo, "Số vé cấp phát phải nhỏ hơn hoặc bằng " + ve.DenSo);
                }
                else if (ds < ve.TuSo)
                {
                    rs2 = false;
                    dxDenSo.SetError(txtDenSo, "Số vé cấp phát phải lớn hơn hoặc bằng " + ve.TuSo);
                }
                else
                {
                    dxDenSo.ClearErrors();
                    rs2 = true;
                }
            }
            else
            {
                rs2 = false;
                dxDenSo.SetError(txtDenSo, "Vui lòng nhập số vé cuối cùng.");
            }

            return rs1 & rs2;
        }

        private Boolean TestNhanVien()
        {
            Boolean rs = true;
            if (cbbNhanVien.EditValue == null)
            {
                rs = false;
                dxNhanVien.SetError(cbbNhanVien, "Vui lòng chọn nhân viên.");
            }
            else
            {
                rs = true;
                dxNhanVien.ClearErrors();
            }
            return rs;
        }
        #endregion

        private void frmCapPhatVe_Load(object sender, EventArgs e)
        {
            dNgayCap.EditValue = DateTime.Today;
            
            gvVeCoTheCap_Load();
            gvVeCoTheCap_RowCountChanged(null, EventArgs.Empty);

            gvVeDaCap_Load();
            gvVeDaCap_RowCountChanged(null, EventArgs.Empty);

            var mhds = from mhd in dc.Mau_Hoa_Dons select mhd;
            cbbMauHoaDon.Properties.DataSource = mhds;
            cbbMauHoaDon.Properties.ValueMember = "MHD_ID";
            cbbMauHoaDon.Properties.DisplayMember = "MHD_MauSo";

            var nvs = from nv in dc.Nhan_Viens select nv;
            cbbNhanVien.Properties.DataSource = nvs;
            cbbNhanVien.Properties.ValueMember = "NV_ID";
            cbbNhanVien.Properties.DisplayMember = "NV_MS";

            //////////////////-----------------gridview
            cbbMauHoaDonGv1.DataSource = mhds;
            cbbMauHoaDonGv1.ValueMember = "MHD_ID";
            cbbMauHoaDonGv1.DisplayMember = "MHD_MauSo";

            cbbMHDID2.DataSource = mhds;
            cbbMHDID2.ValueMember = "MHD_ID";
            cbbMHDID2.DisplayMember = "MHD_MauSo";

            cbbNhanVienQuanLyVe.Properties.DataSource = nvs;
            cbbNhanVienQuanLyVe.Properties.ValueMember = "NV_ID";
            cbbNhanVienQuanLyVe.Properties.DisplayMember = "NV_Ten";

            //////////////////

            txtTuSo.Enabled = false;
            txtDenSo.Enabled = false;
            cbbNhanVien.Enabled = false;
            //btThuHoi.Enabled = false;
            //btCapPhat.Enabled = false;

            cbbMauHoaDon.EditValue = null;
            txtKyHieu.Text = "";
            txtTuSo.Text = "";
            txtDenSo.Text = "";
            cbbNhanVien.EditValue = null;
            


        }

        //CẤP PHÁT - VÉ CÓ THỂ CẤP
        #region
        #region chọn dòng trên gv VeCoTheCap
        private void gvVeCoTheCap_Load()
        {
            try
            {
                var h = from p in dc.VeCoTheCap() orderby p.MHDID, p.KyHieu, p.TuSo select p;
                gcVeCoTheCap.DataSource = h;
                
            }
            catch (Exception ex)
            {
                if (!ex.Message.Contains("Sequence contains no elements")) //----------------> lỗi k ảnh hưởng đến kết quả, nhưng chưa fix đc
                {
                    throw;
                }
            }
        }

        private void gvVeCoTheCap_GetRow(int i)
        {
            if (i >= 0) //gvVeCoTheCap phải có RowCount > 1 vì luôn luôn có 1 dòng là RowFilter
            {
                ve = (VeCoTheCapResult)gvVeCoTheCap.GetRow(i);

                cbbMauHoaDon.EditValue = ve.MHDID;
                txtKyHieu.Text = ve.KyHieu;
                txtTuSo.Text = ve.TuSo.ToString();
                txtDenSo.Text = ve.DenSo.ToString();

                txtTuSo.Enabled = true;
                txtDenSo.Enabled = true;
                cbbNhanVien.Enabled = true;
                //btCapPhat.Enabled = true;
                //btThuHoi.Enabled = false;        
            }
            
        }

        private void gvVeCoTheCap_FocusedRowChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventArgs e)
        {
            int i = e.FocusedRowHandle;
            gvVeCoTheCap_GetRow(i);
        }

        private void gvVeCoTheCap_RowClick(object sender, DevExpress.XtraGrid.Views.Grid.RowClickEventArgs e)
        {
            int i = e.RowHandle;
            gvVeCoTheCap_GetRow(i);
        }
        #endregion

        private void btCapPhat_Click(object sender, EventArgs e)
        {
            if (TestTuSo_DenSo() && TestNhanVien())
            {
                //Sự kiện cập nhật
                cp = new Cap_Phat();
                cp.NV_ID = (int)cbbNhanVien.EditValue;
                cp.MHD_ID = (int)cbbMauHoaDon.EditValue;
                cp.CP_KyHieu = txtKyHieu.Text;
                cp.CP_NgayCap = (DateTime)dNgayCap.EditValue;
                cp.CP_TuSo = int.Parse(txtTuSo.Text);
                cp.CP_DenSo = int.Parse(txtDenSo.Text);
                cp.CP_HoanTra = false;

                int rowHandle = gvVeCoTheCap.GetSelectedRows().First();
                dc.Cap_Phats.InsertOnSubmit(cp);
                try
                {
                    dc.SubmitChanges();
                    
                    gvVeDaCap_Load();
                    gvVeCoTheCap_Load();

                    bool found = false;
                    for (int i = 0; i < gvVeCoTheCap.RowCount - 1; i++)
                    {
                        int tuso = int.Parse(gvVeCoTheCap.GetRowCellValue(i, colTuSo1).ToString());
                        int mauso = int.Parse(gvVeCoTheCap.GetRowCellValue(i, colMHDID1).ToString());
                        string kyhieu = gvVeCoTheCap.GetRowCellValue(i, colKyHieu1).ToString();

                        if (tuso == cp.CP_DenSo + 1 && mauso == cp.MHD_ID && kyhieu == cp.CP_KyHieu)
                        {
                            if (i == rowHandle)
                            {
                                gvVeCoTheCap_GetRow(i);
                            }
                            
                            gvVeCoTheCap.FocusedRowHandle = i;
                            
                            found = true;
                            break;
                        }
                    }

                    if (found == false)
                    {
                        if (gvVeCoTheCap.RowCount > 0)
                        {
                            if (rowHandle == gvVeCoTheCap.RowCount)
                            {
                                gvVeCoTheCap.FocusedRowHandle = rowHandle - 1;
                                gvVeCoTheCap_GetRow(rowHandle - 1);
                            }
                            else
                            {
                                gvVeCoTheCap.FocusedRowHandle = rowHandle;
                                gvVeCoTheCap_GetRow(rowHandle);
                            }
                        }
                    }
                    //if (gvVeCoTheCap.RowCount > 0)
                    //{
                    //    if (i == gvVeCoTheCap.RowCount)
                    //    {
                    //        gvVeCoTheCap.FocusedRowHandle = i - 1;
                    //        gvVeCoTheCap_GetRow(i - 1);
                    //    }
                    //    else
                    //    {
                    //        gvVeCoTheCap.FocusedRowHandle = i;
                    //        gvVeCoTheCap_GetRow(i);
                    //    }
                    //}
                }
                catch (Exception)
                {
                    throw;
                }   
            }
        }

        private void gvVeCoTheCap_RowCountChanged(object sender, EventArgs e)
        {
            if (gvVeCoTheCap.RowCount > 0)
            {
                btCapPhat.Enabled = true;
                cbbNhanVien.Enabled = true;
            }
            else
            {
                btCapPhat.Enabled = false;
                cbbNhanVien.Enabled = false;
                cbbNhanVien.EditValue = null;
                txtTuSo.Text = "";
                txtDenSo.Text = "";
            }
        }
#endregion

        //THU HỒI - GV VÉ ĐÃ CẤP
        #region

        #region chọn dòng trên gv VeDaCap
        private void gvVeDaCap_Load()
        {
            try
            {
                var h = from c in dc.Cap_Phats select c;
                gcVeDaCap.DataSource = h;
            }
            catch (Exception ex)
            {
                if (!ex.Message.Contains("Sequence contains no elements")) //----------------> lỗi k ảnh hưởng đến kết quả, nhưng chưa fix đc
                {
                    throw;
                }
            }
        }

        public void gvVeDaCap_GetRow(int i)
        {

            if (i >= 0)
            {
                cp = (Cap_Phat)gvVeDaCap.GetRow(i);

                cbbMauHoaDon.EditValue = cp.CP_ID;
                txtKyHieu.Text = cp.CP_KyHieu;
                txtTuSo.Text = cp.CP_TuSo.ToString();
                txtDenSo.Text = cp.CP_DenSo.ToString();
                cbbNhanVien.EditValue = cp.NV_ID;

                txtTuSo.Enabled = false;
                txtDenSo.Enabled = false;
                cbbNhanVien.Enabled = false;
                //btThuHoi.Enabled = true;
                //btCapPhat.Enabled = false;    
            }

        }
        
        private void gvVeDaCap_FocusedRowChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventArgs e)
        {
            int i = e.FocusedRowHandle;
            gvVeDaCap_GetRow(i);
        }

        private void gvVeDaCap_RowClick(object sender, RowClickEventArgs e)
        {
            int i = e.RowHandle;
            gvVeDaCap_GetRow(i);
            
        }
        #endregion

        private void btThuHoi_Click(object sender, EventArgs e)
        {
            //Sự kiện thu hồi
            DialogResult rs = new DialogResult();
            rs = XtraMessageBox.Show("Bạn có chắc chắn muốn thu hồi không?", "Xác nhận", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            if (rs == DialogResult.Yes)
            {
                if (cp.Chi_Tiet_Su_Dungs.Count > 0)
                {
                    XtraMessageBox.Show("Không thể thu hồi!\nVé đã được sử dụng.", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                {
                    int i = gvVeDaCap.FocusedRowHandle;
                                        
                    dc.Cap_Phats.DeleteOnSubmit(cp);
                    try
                    {
                        dc.Refresh(System.Data.Linq.RefreshMode.OverwriteCurrentValues, cp);
                        dc.SubmitChanges();

                        gvVeCoTheCap_Load();
                        gvVeDaCap_Load();

                        if (gvVeDaCap.RowCount > 0)
                        {
                            if (i == gvVeDaCap.RowCount)
                            {
                                gvVeDaCap.FocusedRowHandle = i - 1;
                                gvVeDaCap_GetRow(i - 1);
                            }
                            else
                            {
                                gvVeDaCap.FocusedRowHandle = i;
                                gvVeDaCap_GetRow(i);
                            }
                        }

                        XtraMessageBox.Show("Đã thu hồi thành công.", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                    catch (Exception)
                    {
                        throw;
                    }
                }
            }
        }

        private void gvVeDaCap_RowCountChanged(object sender, EventArgs e)
        {
            if (gvVeDaCap.RowCount > 0)
            {
                btThuHoi.Enabled = true;
            }
            else
            {
                btThuHoi.Enabled = false;
                cbbNhanVien.EditValue = null;
                txtTuSo.Text = "";
                txtDenSo.Text = "";
            }
        }
        #endregion

        //LINH TINH
        #region 
        private void btBoQua_Click(object sender, EventArgs e)
        {
            frmCapPhatVe_Load(null, EventArgs.Empty);
            dxDenSo.ClearErrors();
            dxNhanVien.ClearErrors();
            dxTuSo.ClearErrors();
        }

        private void gvVeCoTheCap_CustomColumnDisplayText(object sender, DevExpress.XtraGrid.Views.Base.CustomColumnDisplayTextEventArgs e)
        {
            if (e.Column == colSTT)
            {
                if (e.RowHandle >= 0)
                {
                    e.DisplayText = (e.RowHandle + 1).ToString();
                }
            }
        }

        private void gvVeDaCap_CustomColumnDisplayText(object sender, DevExpress.XtraGrid.Views.Base.CustomColumnDisplayTextEventArgs e)
        {
            if (e.Column == colSTT2)
            {
                if (e.RowHandle >= 0)
                {
                    e.DisplayText = (e.RowHandle + 1).ToString();
                }
            }
        }
        #endregion

      
    }
}